﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BasePlatformCommon;

namespace BasePlatformNet
{
	public class ParaState
	{
		/********************* 状态值常量 ***************************/

		public const int ON = 1;			// 开启
		public const int OFF = 0;			// 关闭

		public const int REAL = 1;			// 实效果
		public const int VIRTUAL = 0;		// 虚拟效果

		/******************* End 状态值常量 *************************/
	}

	// 帧包参数 - 默认 320 * 240
	public class FramePacketPara
	{
		public int row_bytes = 960;			// 显示数据一行字节数（单位为字节）

		public int row_num = 240;			// 显示数据行数（可认为单位为像素）

		public int packetDataSize = 960;	// 显示数据行包字节数（单位为字节）
	}

	// 显示设置包参数
    public class DispConfigPacketPara : JsonClassBase<DispConfigPacketPara>
	{
		/********************** 状态值 *****************************************************/ 

		// 状态项 State_1
		public int Led_Power = ParaState.ON;				// LED屏电源		默认: 开启	-【注意相反性】
		public int Fidelity = ParaState.OFF;				// 低亮度保真功能	默认: 关闭
		public int Disp_Lock = ParaState.OFF;				// 锁屏开关		默认: 关闭（正常显示）
		public int Disp_Black = ParaState.OFF;				// 黑屏开关		默认: 关闭（正常显示）
		//public int Disp_Black = ParaState.ON;				// 黑屏开关		默认: 打开（黑屏显示）
		public int Point_Correction = ParaState.OFF;		// 逐点校正		默认: 关闭
		public int Chroma_Adjust = ParaState.OFF;			// 箱体色度调整	默认: 关闭
		public int Error_Check = ParaState.ON;				// 错误校验		默认: 关闭	-【注意相反性】
		public int Virtual_Screen = ParaState.REAL;			// 四灯虚拟屏		默认: 实效果	-【注意相反性】

		// 状态项 State_2
		public int Forced_Sync = ParaState.OFF;			// 强制同步			默认: 关闭	-【注意相反性】
		public int Local_Pos_Flag = ParaState.OFF;		// 接收卡显示本地所在级联位置编号标志（v1.4）		默认: 关闭
		public int Mcu_RW_Enable = ParaState.OFF;		// L9系统进入DMX MCU读写MEM状态使能（v1.8）		默认: 关闭
		public int Is_Equ_Para = ParaState.OFF;			// 标识本屏的参数（16字节）是否为附属设备的参数, 附属设备参数的标志只会在屏16~屏32的数据中存在, 此时屏16对应第一个附属设备（v1.9）
		public int MBI_6027_Enable = ParaState.OFF;		// MBI6027反馈使能	默认: 关闭
		public int ChannelMapEnable = ParaState.OFF;	// 通道映射使能

		public int Contrast = 64;				// 对比度		1~255	默认: 64
		public int Light_ALL = 255;				// 整屏亮度	0~255	默认: 255
		public int Light_R = 255;				// 红色亮度	0~255	默认: 255
		public int Light_G = 255;				// 绿色亮度	0~255	默认: 255
		public int Light_B = 255;				// 蓝色亮度	0~255	默认: 255

		public int Offset_Line_pixel = 0;		// 屏体相对偏移列数（单位为像素）		默认: 0
		public int Offset_Row_pixel = 0;		// 屏体相对偏移行数（单位为像素）		默认: 0

		public int testMode = 0;				// 测试模式

		/********************** 状态值 *****************************************************/ 

		// 全局操作标记
		public bool overall = false;	// 默认: 非全局操作

		// 根据参数状态生成 16 字节的状态 bytes
		public byte[] buildConfigData()
		{
			byte[] configData = new byte[16];

			#region 状态字节1 - State_1

			byte state1 = configData[0];
			/******************************************/
			if (Led_Power == ParaState.ON)		//-【注意相反性】
				state1 = ClearBit(state1, 0);
			else
				state1 = SetBit(state1, 0);
			/******************************************/
			if (Fidelity == ParaState.ON)
				state1 = SetBit(state1, 1);
			else
				state1 = ClearBit(state1, 1);
			/******************************************/
			if (Disp_Lock == ParaState.ON)
				state1 = SetBit(state1, 2);
			else
				state1 = ClearBit(state1, 2);
			/******************************************/
			if (Disp_Black == ParaState.ON)
				state1 = SetBit(state1, 3);
			else
				state1 = ClearBit(state1, 3);
			/******************************************/
			if (Point_Correction == ParaState.ON)
				state1 = SetBit(state1, 4);
			else
				state1 = ClearBit(state1, 4);
			/******************************************/
			if (Chroma_Adjust == ParaState.ON)
				state1 = SetBit(state1, 5);
			else
				state1 = ClearBit(state1, 5);
			/******************************************/
			if (Error_Check == ParaState.ON)		//-【注意相反性】
				state1 = ClearBit(state1, 6);
			else
				state1 = SetBit(state1, 6);
			/******************************************/
			if (Virtual_Screen == ParaState.REAL)	//-【注意相反性】
				state1 = ClearBit(state1, 7);
			else
				state1 = SetBit(state1, 7);
			/******************************************/
			configData[0] = state1;
			
			#endregion

			#region 状态字节2 - State_2

			byte state2 = configData[1];
			/******************************************/
			if (Forced_Sync == ParaState.ON)		//-【注意相反性】
				state2 = ClearBit(state2, 0);
			else
				state2 = SetBit(state2, 0);
			/******************************************/
			if (Local_Pos_Flag == ParaState.ON)
				state2 = SetBit(state2, 1);
			else
				state2 = ClearBit(state2, 1);
			/******************************************/
			if (Mcu_RW_Enable == ParaState.ON)
				state2 = SetBit(state2, 2);
			else
				state2 = ClearBit(state2, 2);
			/******************************************/
			if (Is_Equ_Para == ParaState.ON)
				state2 = SetBit(state2, 3);
			else
				state2 = ClearBit(state2, 3);
			/******************************************/
			if (MBI_6027_Enable == ParaState.ON)
				state2 = SetBit(state2, 4);
			else
				state2 = ClearBit(state2, 4);
			/******************************************/
			state2 = ClearBit(state2, 5);
			//state2 = ClearBit(state2, 6);
			/******************************************/
			if (ChannelMapEnable == ParaState.ON)
				state2 = SetBit(state2, 6);
			else
				state2 = ClearBit(state2, 6);
			/******************************************/
            state2 = ClearBit(state2, 7);
			configData[1] = state2;

			#endregion

			// Reserved
			configData[2] = 0x0;

			configData[3] = (byte)(0xff & Contrast);
			configData[4] = (byte)(0xff & Light_ALL);
			configData[5] = (byte)(0xff & Light_R);
			configData[6] = (byte)(0xff & Light_G);
			configData[7] = (byte)(0xff & Light_B);

			byte[] Shift_Lnum = Tools.int2Byte2(Offset_Line_pixel);
			configData[8] = Shift_Lnum[0];
			configData[9] = Shift_Lnum[1];
			byte[] Shift_Hnum = Tools.int2Byte2(Offset_Row_pixel);
			configData[10] = Shift_Hnum[0];
			configData[11] = Shift_Hnum[1];

			// Reserved
			configData[12] = 0x0;
			configData[13] = 0x0;
			configData[14] = 0x0;
			configData[15] = (byte)(0xff & testMode);

			return configData;
		}

		// 将byte第index位设为 0, index 从 0 开始
		public static byte ClearBit(byte b, int index) 
		{
			return (byte)(b & (byte.MaxValue - (1 << index))); 
		}

		// 将byte第index位设为 1, index 从 0 开始
		public static byte SetBit(byte b, int index) 
		{
			return (byte)(b | (1 << index)); 
		}
	}
}
